# Set working directory to source file location
setwd(dirname(rstudioapi::getActiveDocumentContext()$path))

# Packages to load
library(tidyverse)
library(magrittr)
library(nnet)
library(modelsummary)

# Custom function
# function to calculate clustered standard errors
# taken from https://stackoverflow.com/questions/73136246/clustered-standard-errors-stars-and-summary-statistics-in-modelsummary-for-mul
mlogit.clust <- function(model, data, variable) {
  beta <- c(t(coef(model)))
  vcov <- vcov(model)
  k <- length(beta)
  n <- nrow(data)
  max_lev <- length(model$lev)
  xmat <- model.matrix(model)
  u <- lapply(2:max_lev, function(x) {
    residuals(model, type = "response")[, x] * xmat
  })
  u <- do.call(cbind, u)
  m <- dim(table(data[, variable]))
  u.clust <- matrix(NA, nrow = m, ncol = k)
  fc <- factor(as.matrix(data[, variable]))
  for (i in 1:k) {
    u.clust[, i] <- tapply(u[, i], fc, sum)
  }
  cl.vcov <- vcov %*% ((m / (m - 1)) * t(u.clust) %*% (u.clust)) %*% vcov
  return(cl.vcov = cl.vcov)
}

# Load data ---
load("data_SESP.RData")

# Figure 1 -------------
data.frame(
  chamber = c(
    "Chamber", "Chamber", "Chamber", "Chamber",
    "Senate", "Senate", "Senate", "Senate"
  ),
  tier = c(
    "Majoritarian tier", "Majoritarian tier",
    "Proportional tier", "Proportional tier",
    "Majoritarian tier", "Majoritarian tier",
    "Proportional tier", "Proportional tier"
  ),
  coalition = c(
    "Left", "Right", "Left", "Right", "Left", "Right",
    "Left", "Right"
  ),
  value = c(8.41, 17.11, 11.06, 1.77, 10.52, 4.2, 15.68, 3.45)
) %>%
  ggplot(
    data = .,
    aes(
      x = chamber,
      y = value,
      fill = coalition
    )
  ) +
  geom_col(position = "dodge", color = "black", linewidth = 0.2) +
  ylab("Intra-coalition disproportionality\n(Gallagher Index)") +
  xlab("") +
  scale_fill_manual(
    name = "Coalition",
    values = c("#999999FF", "#000000FF")
  ) +
  theme_classic() +
  theme(text = element_text(size = 13, family = "Inter")) +
  ggpubr::grids("y") +
  facet_wrap(~tier)

# Empirical section ----------------

## (1) Pre-electoral proportionality principle -------

### Percentage of expected votes and percentage of weighted candidacies ------

candidatз %>%
  select(partito, collegio_uninominale, camera, coalizione, weight) %>%
  group_by(camera, partito, coalizione) %>%
  tally() %>%
  mutate(weight = if_else(camera == "Camera",
                          unique(candidatз$weight[candidatз$camera == "Camera"]),
                          unique(candidatз$weight[candidatз$camera == "Senato"])
  )) %>%
  mutate(n_w = n * weight) %>%
  group_by(partito, coalizione) %>%
  summarise(n_w = sum(n_w)) %>%
  left_join(
    .,
    candidatз %>%
      select(partito, voti_presunti_partito, coalizione) %>%
      unique() %>%
      group_by(coalizione) %>%
      mutate(totale_coalizione = sum(voti_presunti_partito, na.rm = T)) %>%
      mutate(perc_voti_coaliz = voti_presunti_partito / totale_coalizione * 100)
  ) %>%
  mutate(perc_voti_coaliz = if_else(
    is.na(perc_voti_coaliz), 0, perc_voti_coaliz
  )) %>%
  filter(coalizione == "centro-destra" |
           coalizione == "centro-sinistra") %>%
  arrange(coalizione) %>%
  group_by(coalizione) %>%
  mutate(
    sum_n_w = sum(n_w),
    perc_n_w = n_w / sum_n_w * 100
  ) -> emp_sec_1.1

# Right-wing coalition
emp_sec_1.1[emp_sec_1.1$coalizione == "centro-destra", ]$perc_n_w %>%
  as.matrix() -> x
emp_sec_1.1[emp_sec_1.1$coalizione == "centro-destra", ]$perc_voti_coaliz %>%
  as.matrix() -> y

# Gallagher index
sqrt(sum((x - y)^2) / 2)

rm(x)
rm(y)

# Centre-left coalition
emp_sec_1.1[emp_sec_1.1$coalizione == "centro-sinistra", ]$perc_n_w %>%
  as.matrix() -> x
emp_sec_1.1[emp_sec_1.1$coalizione == "centro-sinistra", ]$perc_voti_coaliz %>%
  as.matrix() -> y

# Gallagher index
sqrt(sum((x - y)^2) / 2)

rm(x)
rm(y)

### Percentage of expected votes and percentage of weighted expected seats ------
# For each candidate, the probability of being elected
candidatз$probabilità_elezione <- NA
candidatз$probabilità_elezione[candidatз$coalizione == "centro-sinistra"] <-
  candidatз$csx[candidatз$coalizione == "centro-sinistra"]
candidatз$probabilità_elezione[candidatз$coalizione == "centro-destra"] <-
  candidatз$cdx[candidatз$coalizione == "centro-destra"]
candidatз$probabilità_elezione[candidatз$coalizione == "movimento 5 stelle"] <-
  candidatз$m5s[candidatз$coalizione == "movimento 5 stelle"]
candidatз$probabilità_elezione[
  candidatз$coalizione == "azione - italia viva - calenda"
] <- 0

# Expected MPs elected
candidatз %>%
  group_by(partito, weight, coalizione) %>%
  summarise(eletti_attesi = sum(probabilità_elezione)) %>%
  group_by(coalizione, partito) %>%
  summarise(eletti_attesi_tot = sum(eletti_attesi)) %>%
  filter(coalizione == "centro-destra" |
           coalizione == "centro-sinistra") %>%
  group_by(coalizione) %>%
  summarise(sum(eletti_attesi_tot))

left_join(
  candidatз %>%
    group_by(partito, weight, coalizione) %>%
    mutate(probablità_elezione_w = probabilità_elezione * weight) %>%
    summarise(eletti_attesi_w = sum(probablità_elezione_w)) %>%
    group_by(coalizione, partito) %>%
    summarise(eletti_attesi_w_tot = sum(eletti_attesi_w)) %>%
    filter(coalizione == "centro-destra" |
             coalizione == "centro-sinistra") %>%
    mutate(sum_eletti_attesi_w_tot = sum(eletti_attesi_w_tot)) %>%
    mutate(percentage_weighted_expected_MPs_elected_tot = eletti_attesi_w_tot /
             sum_eletti_attesi_w_tot * 100),
  candidatз %>%
    select(partito, voti_presunti_partito, coalizione) %>%
    unique() %>%
    group_by(coalizione) %>%
    filter(coalizione == "centro-destra" |
             coalizione == "centro-sinistra") %>%
    mutate(totale_coalizione = sum(voti_presunti_partito, na.rm = T)) %>%
    mutate(voti_presunti_partito = if_else(is.na(voti_presunti_partito),
                                           0, voti_presunti_partito
    )) %>%
    mutate(perc_voti_coaliz = voti_presunti_partito / totale_coalizione * 100)
) -> emp_sec_1.2

# Right-wing coalition
emp_sec_1.2[emp_sec_1.2$coalizione == "centro-destra", ]$percentage_weighted_expected_MPs_elected_tot %>%
  as.matrix() -> x
emp_sec_1.2[emp_sec_1.2$coalizione == "centro-destra", ]$perc_voti_coaliz %>%
  as.matrix() -> y

# Gallagher index
sqrt(sum((x - y)^2) / 2)

rm(x)
rm(y)

# Centre-left coalition
emp_sec_1.2[emp_sec_1.2$coalizione == "centro-sinistra", ]$percentage_weighted_expected_MPs_elected_tot %>%
  as.matrix() -> x
emp_sec_1.2[emp_sec_1.2$coalizione == "centro-sinistra", ]$perc_voti_coaliz %>%
  as.matrix() -> y

# Gallagher index
sqrt(sum((x - y)^2) / 2)

rm(x)
rm(y)

### Robustness check for the appendix (separate calculation for Chamber and Senate) ----------
#### Percentage of expected votes and percentage of weighted candidacies ------
candidatз %>%
  select(partito, collegio_uninominale, camera, coalizione, weight) %>%
  group_by(camera, partito, coalizione) %>%
  tally() %>%
  mutate(weight = 1) %>%
  mutate(n = n * weight) %>%
  group_by(partito, coalizione, camera) %>%
  summarise(n = sum(n)) %>%
  left_join(
    .,
    candidatз %>%
      select(partito, voti_presunti_partito, coalizione) %>%
      unique() %>%
      group_by(coalizione) %>%
      mutate(totale_coalizione = sum(voti_presunti_partito, na.rm = T)) %>%
      mutate(perc_voti_coaliz = voti_presunti_partito / totale_coalizione * 100)
  ) %>%
  mutate(perc_voti_coaliz = if_else(
    is.na(perc_voti_coaliz), 0, perc_voti_coaliz
  )) %>%
  filter(coalizione == "centro-destra" |
           coalizione == "centro-sinistra") %>%
  arrange(coalizione) %>%
  group_by(coalizione, camera) %>%
  mutate(
    sum_n = sum(n),
    perc_n = n / sum_n * 100
  ) -> emp_sec_1.1_appendix

# Right-wing coalition - Chamber
emp_sec_1.1_appendix[emp_sec_1.1_appendix$coalizione == "centro-destra" &
                       emp_sec_1.1_appendix$camera == "Camera", ]$perc_n %>%
  as.matrix() -> x
emp_sec_1.1_appendix[emp_sec_1.1_appendix$coalizione == "centro-destra" &
                       emp_sec_1.1_appendix$camera == "Camera", ]$perc_voti_coaliz %>%
  as.matrix() -> y

# Gallagher index
sqrt(sum((x - y)^2) / 2)

rm(x)
rm(y)

# Right-wing coalition - Senate
emp_sec_1.1_appendix[emp_sec_1.1_appendix$coalizione == "centro-destra" &
                       emp_sec_1.1_appendix$camera == "Senato", ]$perc_n %>%
  as.matrix() -> x
emp_sec_1.1_appendix[emp_sec_1.1_appendix$coalizione == "centro-destra" &
                       emp_sec_1.1_appendix$camera == "Senato", ]$perc_voti_coaliz %>%
  as.matrix() -> y

# Gallagher index
sqrt(sum((x - y)^2) / 2)

rm(x)
rm(y)

# Centre-left coalition - Chamber
emp_sec_1.1_appendix[emp_sec_1.1_appendix$coalizione == "centro-sinistra" &
                       emp_sec_1.1_appendix$camera == "Camera", ]$perc_n %>%
  as.matrix() -> x
emp_sec_1.1_appendix[emp_sec_1.1_appendix$coalizione == "centro-sinistra" &
                       emp_sec_1.1_appendix$camera == "Camera", ]$perc_voti_coaliz %>%
  as.matrix() -> y

# Gallagher index
sqrt(sum((x - y)^2) / 2)

rm(x)
rm(y)

# # Centre-left coalition - Senate
emp_sec_1.1_appendix[emp_sec_1.1_appendix$coalizione == "centro-sinistra" &
                       emp_sec_1.1_appendix$camera == "Senato", ]$perc_n %>%
  as.matrix() -> x
emp_sec_1.1_appendix[emp_sec_1.1_appendix$coalizione == "centro-sinistra" &
                       emp_sec_1.1_appendix$camera == "Senato", ]$perc_voti_coaliz %>%
  as.matrix() -> y

# Gallagher index
sqrt(sum((x - y)^2) / 2)

rm(x)
rm(y)

#### Percentage of expected votes and percentage of weighted expected seats ------
left_join(
  candidatз %>%
    filter(coalizione == "centro-sinistra" |
             coalizione == "centro-destra") %>%
    group_by(partito, coalizione, camera) %>%
    summarise(eletti_attesi = sum(probabilità_elezione)),
  candidatз %>%
    filter(coalizione == "centro-sinistra" |
             coalizione == "centro-destra") %>%
    group_by(partito, coalizione, camera) %>%
    summarise(eletti_attesi = sum(probabilità_elezione)) %>%
    group_by(coalizione, camera) %>%
    summarise(eletti_attesi_coal = sum(eletti_attesi))
) %>%
  mutate(perc_eletti_attesi_coal = 
           eletti_attesi / eletti_attesi_coal * 100) %>%
  left_join(
    .,
    candidatз %>%
      select(partito, voti_presunti_partito, coalizione) %>%
      unique() %>%
      group_by(coalizione) %>%
      filter(coalizione == "centro-destra" |
               coalizione == "centro-sinistra") %>%
      mutate(totale_coalizione = sum(voti_presunti_partito, na.rm = T)) %>%
      mutate(voti_presunti_partito = if_else(is.na(voti_presunti_partito),
                                             0, voti_presunti_partito
      )) %>%
      mutate(perc_voti_coaliz = 
               voti_presunti_partito / totale_coalizione * 100)
  ) -> emp_sec_1.2_appendix

# Centre-right coalition - Chamber
emp_sec_1.2_appendix[emp_sec_1.2_appendix$coalizione == "centro-destra" &
                       emp_sec_1.2_appendix$camera == "Camera", ]$perc_eletti_attesi_coal %>%
  as.matrix() -> x
emp_sec_1.2_appendix[emp_sec_1.2_appendix$coalizione == "centro-destra" &
                       emp_sec_1.2_appendix$camera == "Camera", ]$perc_voti_coaliz %>%
  as.matrix() -> y

# Gallagher index
sqrt(sum((x - y)^2) / 2)

rm(x)
rm(y)

# Centre-right coalition - Senate
emp_sec_1.2_appendix[emp_sec_1.2_appendix$coalizione == "centro-destra" &
                       emp_sec_1.2_appendix$camera == "Senato", ]$perc_eletti_attesi_coal %>%
  as.matrix() -> x
emp_sec_1.2_appendix[emp_sec_1.2_appendix$coalizione == "centro-destra" &
                       emp_sec_1.2_appendix$camera == "Senato", ]$perc_voti_coaliz %>%
  as.matrix() -> y

# Gallagher index
sqrt(sum((x - y)^2) / 2)

rm(x)
rm(y)

# Centre-left coalition - Chamber
emp_sec_1.2_appendix[emp_sec_1.2_appendix$coalizione == "centro-sinistra" &
                       emp_sec_1.2_appendix$camera == "Camera", ]$perc_eletti_attesi_coal %>%
  as.matrix() -> x
emp_sec_1.2_appendix[emp_sec_1.2_appendix$coalizione == "centro-sinistra" &
                       emp_sec_1.2_appendix$camera == "Camera", ]$perc_voti_coaliz %>%
  as.matrix() -> y

# Gallagher index
sqrt(sum((x - y)^2) / 2)

rm(x)
rm(y)

# Centre-left coalition - Senate
emp_sec_1.2_appendix[emp_sec_1.2_appendix$coalizione == "centro-sinistra" &
                       emp_sec_1.2_appendix$camera == "Senato", ]$perc_eletti_attesi_coal %>%
  as.matrix() -> x
emp_sec_1.2_appendix[emp_sec_1.2_appendix$coalizione == "centro-sinistra" &
                       emp_sec_1.2_appendix$camera == "Senato", ]$perc_voti_coaliz %>%
  as.matrix() -> y

# Gallagher index
sqrt(sum((x - y)^2) / 2)

rm(x)
rm(y)

## (2) Smallness and the threat of defection --------

# How many "weighted expected MPs elected" for each party?
left_join(
  candidatз %>%
    group_by(partito, weight, coalizione) %>%
    mutate(probablità_elezione_w = probabilità_elezione * weight) %>%
    summarise(eletti_attesi_w = sum(probablità_elezione_w)) %>%
    group_by(coalizione, partito) %>%
    summarise(eletti_attesi_w_tot = sum(eletti_attesi_w)) %>%
    filter(coalizione == "centro-destra" |
             coalizione == "centro-sinistra") %>%
    left_join(
      .,
      candidatз %>%
        group_by(partito, weight, coalizione) %>%
        mutate(probablità_elezione_w = probabilità_elezione * weight) %>%
        summarise(eletti_attesi_w = sum(probablità_elezione_w)) %>%
        group_by(coalizione, partito) %>%
        summarise(eletti_attesi_w_tot = sum(eletti_attesi_w)) %>%
        filter(coalizione == "centro-destra" |
                 coalizione == "centro-sinistra") %>%
        group_by(coalizione) %>%
        summarise(eletti_attesi_w_tot_coaliz = sum(eletti_attesi_w_tot))
    ) %>%
    mutate(percentage_weighted_expected_MPs_elected = eletti_attesi_w_tot /
             eletti_attesi_w_tot_coaliz * 100) %>%
    filter(!grepl("indipendente", partito)) %>%
    select(coalizione, partito, percentage_weighted_expected_MPs_elected) %>%
    arrange(coalizione),
  candidatз %>%
    select(coalizione, partito, voti_presunti_partito) %>%
    unique() %>%
    filter(coalizione == "centro-destra" |
             coalizione == "centro-sinistra") %>%
    left_join(., candidatз %>%
                select(coalizione, partito, voti_presunti_partito) %>%
                unique() %>%
                filter(coalizione == "centro-destra" |
                         coalizione == "centro-sinistra") %>%
                group_by(coalizione) %>%
                summarise(
                  voti_presunti_tot_coaliz =
                    sum(voti_presunti_partito, na.rm = T)
                )) %>%
    mutate(percentage_expected_votes = voti_presunti_partito /
             voti_presunti_tot_coaliz * 100) %>%
    filter(!grepl("indipendente", partito)) %>%
    select(coalizione, partito, percentage_expected_votes) %>%
    arrange(coalizione)
)

### Figure 2 ---------------
emp_sec_1.2 %>%
  mutate(diff = percentage_weighted_expected_MPs_elected_tot - perc_voti_coaliz) %>%
  mutate(text_position = if_else(
    percentage_weighted_expected_MPs_elected_tot > perc_voti_coaliz,
    percentage_weighted_expected_MPs_elected_tot,
    perc_voti_coaliz
  )) %>%
  pivot_longer(cols = c(
    percentage_weighted_expected_MPs_elected_tot, perc_voti_coaliz
  )) %>%
  mutate(partito_new = str_replace_all(
    partito, "__", " - "
  )) %>%
  mutate(partito_new = str_replace_all(
    partito_new, "_", " "
  ) %>% str_to_title()) %>%
  mutate(partito_new = partito_new %>%
           str_replace("D ", "d’")) %>%
  mutate(partito_new = partito_new %>%
           str_replace(" Per ", " per ")) %>%
  mutate(partito_new = partito_new %>%
           str_replace(" E ", " e ")) %>%
  mutate(partito_new = partito_new %>%
           str_replace(" Con ", " con ")) %>%
  mutate(coalizione2 = if_else(
    coalizione == "centro-destra",
    1, 0
  )) %>%
  mutate(partito_new = str_wrap(
    partito_new, 30
  )) %>%
  mutate(diff = if_else(
    diff > 0,
    diff %>% round(digits = 1) %>%
      as.character() %>%
      paste0("+", .),
    diff %>% round(digits = 1) %>%
      as.character() %>%
      paste0(.) %>%
      str_replace_all("-", "−")
  )) %>%
  ggplot(aes(
    y = reorder(partito_new, coalizione2),
    x = value,
    fill = name,
    label = diff
  )) +
  geom_col(
    col = "grey10", lwd = 0.15,
    position = position_dodge()
  ) +
  geom_hline(yintercept = 5.5, lwd = 0.3) +
  theme_classic() +
  ylab("Coalition
Left-wing                               Right-wing") +
  xlab("Percentage within coalition") +
  scale_fill_manual(
    name = " ",
    labels = c(
      "Expected seats\n(weighted)",
      "Expected votes"
    ),
    values = c("#000000FF", "#999999FF")
  ) +
  xlim(0, 87) +
  theme(text = element_text(size = 13, family = "Inter"),
        legend.key.height = unit(0.8, "cm"),
        legend.title = element_text(margin = margin(b = 10))) +
  guides(fill = guide_legend(byrow = TRUE)) +
  geom_text(aes(x = text_position, y = reorder(partito_new, value)),
            hjust = -0.2,
            data = . %>% filter(name == "percentage_weighted_expected_MPs_elected_tot"),
            family = "Inter"
  ) +
  ggpubr::grids("x")

## (4) Incumbency ---------

### Model for right-wing coalition ---------
model_dx_1 <- multinom(
  partito ~ safe_seat_cdx + share_incumbents_region +
    senato,
  data = data_regression_dx,
  Hess = TRUE
)

# get coefficients, variance, clustered standard errors, and p values
b <- c(t(coef(model_dx_1)))
var <- mlogit.clust(model_dx_1, data_regression_dx, "regione_candidatura_2022")
se <- sqrt(diag(var))
p <- (1 - pnorm(abs(b / se))) * 2

# Table with un-clustered standard errors
modelsummary(
  model_dx_1,
  statistic = "({std.error})",
  shape = statistic ~ response,
  stars = c("*" = .1, "**" = .05, "***" = .01)
)
# Table with clustered standard errors
modelsummary(
  model_dx_1,
  statistic = "({round(se, 3)})",
  shape = statistic ~ response,
  stars = c("*" = .1, "**" = .05, "***" = .01)
)

# Create final table
modelsummary(
  model_dx_1,
  output = "modelsummary_list",
  statistic = "({round(se, 3)})",
  shape = statistic ~ response,
  stars = c("*" = .1, "**" = .05, "***" = .01)
) -> model_dx_1_summary
model_dx_1_summary$tidy$p.value <- p

modelsummary(model_dx_1_summary,
             statistic = "({round(se, 3)})",
             shape = statistic ~ response,
             stars = c("*" = .1, "**" = .05, "***" = .01)
)

### Model for left-wing coalition ---------
model_sx_1 <- multinom(partito ~ safe_seat_csx + share_incumbents_region
                       + senato, data = data_regression_sx)

# get coefficients, variance, clustered standard errors, and p values
b <- c(t(coef(model_sx_1)))
var <- mlogit.clust(model_sx_1, data_regression_sx, "regione_candidatura_2022")
se <- sqrt(diag(var))
p <- (1 - pnorm(abs(b / se))) * 2

# Table with un-clustered standard errors
modelsummary(
  model_sx_1,
  statistic = "({std.error})",
  shape = statistic ~ response,
  stars = c("*" = .1, "**" = .05, "***" = .01)
)
# Table with clustered standard errors
modelsummary(
  model_sx_1,
  statistic = "({round(se, 3)})",
  shape = statistic ~ response,
  stars = c("*" = .1, "**" = .05, "***" = .01)
)

# Create final table
modelsummary(
  model_sx_1,
  output = "modelsummary_list",
  statistic = "({round(se, 3)})",
  shape = statistic ~ response,
  stars = c("*" = .1, "**" = .05, "***" = .01)
) -> model_sx_1_summary
model_sx_1_summary$tidy$p.value <- p

modelsummary(model_sx_1_summary,
             statistic = "({round(se, 3)})",
             shape = statistic ~ response,
             stars = c("*" = .1, "**" = .05, "***" = .01)
)

## (5) Volatility ---------
### Figure 3 ------------
candidatз %>%
  filter(partito != "indipendente_csx") %>%
  filter(partito != "indipendente_cdx") %>%
  filter(partito != "indipendente_m5s") %>%
  filter(partito != "indipendente_az-iv") %>%
  select(
    partito, voti_presunti_partito,
    voti_veri_camera
  ) %>%
  unique() %>%
  mutate(partito_new = str_replace_all(
    partito, "__", " - "
  )) %>%
  mutate(partito_new = str_replace_all(
    partito_new, "_", " "
  ) %>% str_to_title()) %>%
  mutate(partito_new = partito_new %>%
           str_replace("D ", "d’")) %>%
  mutate(partito_new = partito_new %>%
           str_replace(" Per ", " per ")) %>%
  mutate(partito_new = partito_new %>%
           str_replace(" E ", " e ")) %>%
  mutate(partito_new = partito_new %>%
           str_replace(" Con ", " con ")) %>%
  select(-partito) %>%
  mutate(text_position = if_else(
    voti_presunti_partito > voti_veri_camera,
    voti_presunti_partito,
    voti_veri_camera
  )) %>%
  mutate(diff = voti_veri_camera - voti_presunti_partito) %>%
  pivot_longer(cols = c(
    "voti_presunti_partito",
    "voti_veri_camera"
  )) %>%
  mutate(partito_new = str_wrap(partito_new, 30)) %>%
  mutate(diff = if_else(
    diff > 0,
    diff %>% round(digits = 1) %>%
      as.character() %>%
      paste0("+", .),
    diff %>% round(digits = 1) %>%
      as.character() %>%
      paste0(.) %>%
      str_replace_all("-", "−")
  )) %>%
  ggplot(aes(
    y = reorder(partito_new, value),
    x = value,
    fill = name,
    label = diff
  )) +
  geom_col(
    col = "grey15",
    linewidth = 0.2,
    position = "dodge"
  ) +
  ylab("") +
  xlab("Vote share (Chamber)") +
  scale_fill_manual(
    name = "Vote share",
    labels = c(
      "Expected in mid August", "Actual on 25 September"
    ) %>% str_wrap(15)
    ,
    values = c("#000000FF", "#999999FF")
  ) +
  theme_classic() +
  xlim(0, 30) +
  theme(
    text = element_text(size = 13, family = "Inter"),
    legend.key.height = unit(0.8, "cm"),
    legend.title = element_text(margin = margin(b = 10))
  ) +
  guides(fill = guide_legend(byrow = TRUE)) +
  geom_text(aes(x = text_position, y = reorder(partito_new, value)),
            hjust = -0.3,
            data = . %>% filter(name == "voti_veri_camera"),
            family = "Inter"
  ) +
  ggpubr::grids("x")

## Figure 4 ---------
data.frame(
  year = c(1994, 1996, 2001, 2018),
  Left = c(4.98,	4.37,	7.47,	9.83),
  Right = c(16.93,	1.48,	7.6,	1.7)
) %>%
  mutate(year = as.character(year)) %>%
  pivot_longer(cols = c("Left", "Right")) %>%
  ggplot(
    data = .,
    aes(
      x = year,
      y = value,
      fill = name
    )
  ) +
  geom_col(position = "dodge", color = "black", linewidth = 0.2) +
  ylab("Intra-coalition disproportionality") +
  xlab("Election") +
  scale_fill_manual(
    name = "Coalition",
    values = c("#999999FF", "#000000FF")
  ) +
  theme_classic() +
  theme(text = element_text(size = 13, family = "Inter")) +
  ggpubr::grids("y")
